# 容器-list列表
import random
# 列表定义
print("-" * 50, "列表定义", "-" * 50)
# 字面量定义
print("字面量定义：", [1, "2", "qwe"])
# 变量定义
lst = ["张三", "李四", 1, 2]
print("变量定义：", lst, f"数据类型:{type(lst)}")
# 定义空列表
lst1 = []
lst2 = list()
print("定义空列表：", lst1, lst2)
# 这样创建只能创建一个元素，创建多个元素会报错
lst1 = list("q")
# 创建列表 从0开始到10（不包括10），步长为2
lst2 = list(range(0, 10, 2))
print("lst1：", lst1)
print("rangelst2：", lst2)
# 列表可以通过+号相加
lst3 = lst1 + lst2
print(f"lst3：{lst1 + lst2}")
# 嵌套列表
lst4 = ["1", lst3]
print("嵌套列表", lst4)
print("数据类型：", type(lst4))

# 列表的方法
print("-" * 50, "列表常用方法", "-" * 50)
# 自动解包:注意左边变量的个数要等于右边列表的长度
lst = ["紫嫣", "嫣然", "萌萌"]
value1, value2, value3 = lst
print("自动解包：", value1, value2, value3)
lst = []
# 插入元素
lst.insert(1, "李四")
print("insert插入元素", lst)
# 追加元素（追加在尾部）
lst.append( True)
print("append追加元素（追加在尾部）：", lst)
lst.append(["hello", False, None])
print("append追加元素（追加在尾部）追加一个列表：", lst)
# 追加一个列表（用这种加进来后的列表和append的不同）
lst.extend(["hello", True, None, "张三"])
print("extend追加元素（追加在尾部,和append的不同之处）追加一个列表：", lst)
# 列表索引可以取负数，表示从右往左取
print("获取列表下标的元素(-1下标和-3下标)：", lst[-1], lst[-3])
# 修改元素
lst[0] = "王五"
print("通过下标修改元素", lst)
# index查询列表元素的下表，如果查找不到会报错，比如查找"李四1"会抛出异常
print("index查找元素，下标为（找不到就抛出异常）：", lst.index("张三"))
# in：某个元素在列表中存不存在  存在返回True  不存在返回False
# not in：某个元素不在列表中   如果不在返回True  如果在 返回False
print(f"zhangsan在不在序列中,不在返回True：{'zhangsan' not in lst}")
# 删除元素 del(下标)
# 删除元素 pop(可以有返回值)
# 删除元素 remove(元素):从前往后删除第一个指定的元素，元素不存在会抛出异常
del lst[2]
print("del删除元素：", lst)
name = lst.pop(1)
print("pop删除的元素：", name)
print("pop删除元素：", lst)
lst.remove("张三")
print("remove删除元素：", lst)
# 列表的翻转
lst.reverse()
print("翻转后的列表：", lst)
# 列表的拷贝，得到一个新的列表
new_lst = lst.copy()
print("copy列表的拷贝，得到一个新的列表：", new_lst)
print("lst的id：", id(lst))
print("new_lst的id：", id(new_lst))
print("统计某个元素（True）的数目：", lst, lst.count(True))
# 列表的长度
print("列表的长度:", len(lst))
# 遍历列表
print("遍历列表：", end="\t")
for item in lst:
    print(item, end="   ")
print()
# 清空列表
lst.clear()
print("清空列表列表：", lst)


print("-" * 50, "列表生成式", "-" * 50)
lst1 = [f"紫嫣-{item}" for item in range(50)]
print("列表生成式:", lst1)
lst2 = [f"嫣然-{item}" for item in range(10) if item % 3 == 0]
print("带条件的列表生成式:", lst2)


# 列表的排序
print("-" * 50, "列表的排序", "-" * 50)
# sort不会产生一个新的元素，默认是False升序
lst = [2, 3.4, 5.2, 1.3, 3,1, 4, 6, 3, 1]
lst.sort(reverse=False)
print("原列表:", lst)
print("sort排序后:", lst)
# 如果直接用sorted会产生一个新的列表
lst = [2, 3.4, 5.2, 1.3, 3,1, 4, 6, 3, 1]
new_lst = sorted(lst)
print("原列表:", lst)
print("sorted排序后:", new_lst)
# 按照这个规则排序，每次都拿列表内每个元素的下标为1的元素排序
def sort_key(data):
    return data[1]
my_lst = [["a", 44],["b", 22], ["c", 33]]
# 如果有字母 key=str.lower忽略大小写排序
my_lst.sort(key=sort_key, reverse=False)
print("sort排序,对不是纯数字的列表排序:", my_lst)
# 匿名函数排序
my_lst.sort(key=lambda data: data[1], reverse=True)
print("sort排序,使用lambda表达式:", my_lst)


# 练习
print("-" * 50, "练习", "-" * 50)
# 练习 remove做抽奖，保证同一个人不会抽两次
lst = ["一哥", "小二", "张三", "李四", "王五", "赵六", "小七", "陈八", "老九", "小十"]
print("中奖者分别是：", end=" ")
for i in range(3):
    # random.choice(列表) 在列表中随机抽取一个
    person = random.choice(lst)
    # 移除列表的某一个元素
    lst.remove(person)
    print(person, end=" ")
print()